package com.hpeu_01.day0126;

import org.junit.Test;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * 通过反射获取方法
 * 1. getMethods()：获取类中的所有公共方法，包括所有父类中的方法
 * 2. getMethod(String name, Class<?>... parameterTypes)：获取指定名称的方法（公共）
 * 3. getDeclaredMethods()：获取本类中定义的所有方法，包括私有方法
 * 4. getDeclaredMethod(String name, Class<?>... parameterTypes)：获取本类中指定名称的方法
 */
public class ReflectMethod {
    @Test
    public void test05() throws Exception{
        Class<Person> clazz = Person.class;
        Method setId = clazz.getDeclaredMethod("setId", Integer.class);

        //获取方法的名字
        String name = setId.getName();
        System.out.println(name);

        //获取方法返回值的类型
        Class<?> returnType = setId.getReturnType();
        System.out.println(returnType.getSimpleName());

        // 获取方法的参数列表类型
        Class<?>[] parameterTypes = setId.getParameterTypes();
        for (Class<?> parameterType : parameterTypes) {
            System.out.println(parameterType.getSimpleName());
        }

        // 获取访问修饰符，需要调用Modifier.toString()才能得到字符串类型的方法修修饰符
        int modifiers = setId.getModifiers();
        System.out.println(Modifier.toString(modifiers));
    }

    @Test
    public void test04() throws Exception{
        Class<Person> clazz = Person.class;
        Method setId = clazz.getDeclaredMethod("setId", Integer.class);
        System.out.println(setId);
    }

    @Test
    public void test03(){
        Class<Person> clazz = Person.class;
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
    }

    @Test
    public void test02() throws Exception {
        Class<Person> clazz = Person.class;
        Person person = clazz.newInstance();
        Method setGrade = clazz.getMethod("setGrade", String.class);
        System.out.println(setGrade);
        //调用方法
        setGrade.invoke(person, "大四");
        Method getGrade = clazz.getMethod("getGrade");
        System.out.println(getGrade);
        Object invoke = getGrade.invoke(person);
        System.out.println(invoke);
    }

    @Test
    public void test01(){
        Class<Person> clazz = Person.class;
        //1. getMethods()：获取类中的所有公共方法，包括所有父类中的方法
        Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
    }
}
